10992. Сортировка дат

 

Отсортируйте даты согласно следующего критерия:

·        в порядке неубывания годов;

·        если даты имеют одинаковый год, то сортировать их следует в порядке неубывания месяцев;

·        если даты имеют одинаковый год и месяц, то сортировать их следует в порядке неубывания дней.

 

Вход. Первая строка содержит количество дат n (1 ≤ n ≤ 1000). Каждая из следующих n строк содержит дату в формате day.month.year. Каждая дата задается тремя целыми числами – день (от 1 до 31), месяц (от 1 до 12) и год (от 1900 до 2021).

 

Выход. Выведите даты в порядке неубывания в таком же формате, в каком они заданы на входе.

 

Пример входа

Пример выхода

10

16.5.2003

28.9.2016

17.12.2009

25.1.2005

28.1.2001

5.7.1999

22.7.2020

28.1.2018

24.5.2005

6.4.2017

5.7.1999

28.1.2001

16.5.2003

25.1.2005

24.5.2005

17.12.2009

28.9.2016

6.4.2017

28.1.2018

22.7.2020

 

 

РЕШЕНИЕ

сортировка

 

Анализ алгоритма

С каждой датой свяжем структуру MyDate, которая содержит день, месяц и год. Создадим массив структур. Отсортируем его согласно заданного критерия.

 

Реализация алгоритма

Объявим структуру MyDate.

 

struct MyDate

{

  int day, mon, year;

};

 

Объявим массив дат.

 

MyDate lst[1001];

 

Функция f является компаратором, сортирующих даты согласно следующего критерия:

·        в порядке неубывания годов;

·        если даты имеют одинаковый год, то сортировать их следует в порядке неубывания месяцев;

·        если даты имеют одинаковый год и месяц, то сортировать их следует в порядке неубывания дней.

 

int f(MyDate a, MyDate b)

{

  if ((a.year == b.year) && (a.mon == b.mon)) return a.day < b.day;

  if (a.year == b.year) return a.mon < b.mon;

  return a.year < b.year;

}

 

Основная часть программы. Читаем входные данные.

 

scanf("%d", &n);

for (i = 0; i < n; i++)

  scanf("%d.%d.%d", &lst[i].day, &lst[i].mon, &lst[i].year);

 

Сортируем участников соревнования.

 

sort(lst, lst + n, f);

 

Выводим отсортированные даты.

 

for (i = 0; i < n; i++)

  printf("%d.%d.%d\n", lst[i].day, lst[i].mon, lst[i].year);

 

Java реализация

 

import java.util.*;

 

class MyDate

{

  int day;

  int month;

  int year;

 

  public MyDate(int day, int month, int year)

  {

    this.day = day;

    this.month = month;

    this.year = year;

  }

}

 

public class Main

{

  public static class MyFun implements Comparator<MyDate>

  {

    public int compare(MyDate a, MyDate b)

    {

      if (a.year == b.year && a.month == b.month)

         return a.day - b.day;

      if (a.year == b.year) return a.month - b.month;

      return a.year - b.year;

    }

  }

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    int n = con.nextInt();

    ArrayList<MyDate> myDates = new ArrayList<MyDate>();   

 

    for (int i = 0; i < n; i++)

    {

      String s = con.next();

      StringTokenizer st = new StringTokenizer(s, ".");

      int day = Integer.parseInt(st.nextToken());

      int month = Integer.parseInt(st.nextToken());

      int year = Integer.parseInt(st.nextToken());

      myDates.add(new MyDate(day, month, year));

    }

   

    Collections.sort(myDates, new MyFun());   

 

    for (int i = 0; i < n; i++)

      System.out.println(myDates.get(i).day + "." +

                 myDates.get(i).month + "." +  myDates.get(i).year);

    con.close();

  }

}